home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # emacs-fe --- front end driver for `emacs' and other programs
-
- # Copyright (C) 1995, 1996 Noah S. Friedman
-
- # Author: Noah Friedman <friedman@prep.ai.mit.edu>
- # Created: 1995-09-11
-
- # $.Id: emacs-fe,v 1.8 1996/03/07 04:32:33 friedman Exp $
-
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2, or (at your option)
- # any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, you can either send email to this
- # program's maintainer or write to: The Free Software Foundation,
- # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
-
- # Commentary:
-
- # Inspired by a similar set of scripts by Charles Sandel <sandel@cli.com>,
- # but generalized into this single script.
-
- # Front-end shell script for GNU Emacs, used to manage multiple versions of
- # Emacs and its associated utilities.
- #
- # Strategy: Install this script as "$prefix/bin/[progname]", for each
- # program named [progname], (e.g. "emacs", "ispell", "etags", etc). These
- # are the commands users would normally execute to run them.
-
- # Give each version of emacs/xemacs/mule/ispell a separate hierarchy under
- # $prefix/[emacs|xemacs|mule|ispell], with the name
- # "[emacs|xemacs|mule|ispell]-NN.NN" where NN.NN is the version number.
- # This script looks at what versions are available, and selects a version,
- # currently whatever is specified by $DEFAULTLVERSION.
-
- # However, users can specify their own choice to force the selection of a
- # particular version by setting the environment variable PROGNAMEVERSION
- # (e.g. EMACSVERSION, MULEVERSION, XEMACSVERSION, etc.) to have a value
- # which is the version number of the program that they want to use (just
- # the numeric value), or to specify either the NEWEST or OLDEST versions.
-
- # Code:
-
- # Name by which this script was invoked.
- progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
-
- # To prevent hairy quoting and escaping later.
- bq='`'
- eq="'"
-
- case "$progname" in
- emacs-fe-print )
- case $# in
- 1 ) : ;;
- * )
- echo "$progname: Exactly one argument is required." 1>&2
- exit 1
- ;;
- esac
-
- # sed is more portable than `dirname'
- dir=`echo "$0" | sed -e 's/\/*$//' -e 's/\/[^\/]*$//'`
- if test -f "$dir/$1"; then
- EMACS_FE_PRINT=t
- export EMACS_FE_PRINT
- exec "$dir/$1"
- fi
-
- echo "$progname: $bq$dir/$1$eq does not seem to exist." 1>&2
- exit 1
- ;;
- esac
-
- DEFAULTVERSION="${DEFAULTVERSION-NEWEST}"
- VARIANT="${EMACSVARIANT-emacs}"
-
- if [ "$prefix" = "" ] ; then
- # root of the GNU installed tree
- prefix=/usr/local/gnu
- fi
-
- if [ ! -d "$prefix" ] ; then
- echo "Cannot find root of GNU tree ($prefix)."
- exit 1
- fi
-
- case "$progname" in
- emacs | lemacs | xemacs | mule | ispell )
- if [ "$eprefix" = "" ] ; then
- # prefix name of the subdirectory
- eprefix="${progname}/${progname}-"
- fi
- ;;
- * )
- eprefix="$VARIANT/${VARIANT}-"
- ;;
- esac
-
- # Find out which versions are available on the system and sort them
- # in numeric order.
- #
- # The largish sed script prefixes all version numbers with a sort key.
- # That key is constructed by padding out any single or double digits to 3
- # digits from the version number, then converting all occurences of `.' to
- # `0', and prefixing and suffixing the entire result with an additional
- # zero. After sorting, the sort key is stripped from the output.
- # We do all this because `sort' cannot numerically sort decimal numbers and
- # will stop on the first `.'.
- # This may not work correctly if the version number has more than 4 levels
- # of minor versions (e.g. "1.2.3.4.5" may cause problems).
- availversions=`ls -1d $prefix/${eprefix}*/. 2> /dev/null \
- | sed -n \
- -e "s#^$prefix/$eprefix\([0-9.][0-9.]*\)/\.*#\1#" \
- -e 'h
- s/[^.]*[^0-9.][^.]*\.//g
- :0
- /[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*/!{
- s/$/.0/
- b 0
- }
- s/^/./
- s/$/./
- :1
- s/\.\([0-9]\)\./.00\1./g
- s/\.\([0-9][0-9]\)\./.0\1./g
- t 1
- s/\./0/g
- G
- s/\n/ /' \
- -e 'p' \
- | sort -nu \
- | sed -e 's/.* //'`
-
- if [ "$availversions" = "" ] ; then
- echo "No version of $progname found in $prefix/$eprefix*."
- exit 1
- fi
-
- # This sets `oldest' to the oldest version available, and `newest'
- # to the newest version available.
- # On line 1, we save the original pattern in the hold space and restore it
- # in case it is the only line of input.
- eval `echo "$availversions" \
- | sed -ne '1{h;s/^/oldest=/p;g;}
- ${s/^/newest=/p;}
- '`
-
- # The environment variable [progname]VERSION can have a value which specifies
- # a version number, OR it can contain the values "NEWEST" or "OLDEST" to
- # specify the newest or oldest version which was found.
- sed_upcase='y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
-
- PROGNAME=`echo "$progname" | sed -e "$sed_upcase" -e 's/-/_/g'`
- eval version=\"\$${PROGNAME}VERSION\"
-
- # If there is no ETAGSVERSION, EMACSCLIENTVERSION, etc, then look for
- # EMACSVERSION, XEMACSVERSION, or whatever the current variant is.
- case "$version" in
- '' )
- case "$progname" in
- ispell )
- # If this is ispell and ISPELLVERSION isn't set, just use 3.1.
- # We could run this script recursively with a flag indicating to
- # find the current emacs variant and version and just print it out,
- # but that is a very pathological case and is a lot of work.
- version=3.1 ;;
- * )
- variant=`echo "$VARIANT" | sed -e "$sed_upcase"`
- eval version=\"\$${variant}VERSION\"
- case "$version" in
- '' ) version="$DEFAULTVERSION" ;;
- esac
- ;;
- esac
- esac
-
- case "$version" in
- [Oo][Ll][Dd][Ee][Ss][Tt]) version="$oldest" ;;
- [Nn][Ee][Ww][Ee][Ss][Tt]) version="$newest" ;;
- '') version="$oldest" ;;
- *)
- if [ ! -d "$prefix/$eprefix$version" ] ; then
- echo "$progname: $version: Cannot find requested version." 1>&2
- version=
- fi
- ;;
- esac
-
- # If we don't have a version by now, then give up.
- if [ "$version" = "" ] ; then
- exec 1>&2
- echo "$progname: Cannot determine which version to use."
- case "$availversions" in
- */* )
- echo "Available versions are:"
- for f in $availversions; do
- echo " $f"
- done | sort
- ;;
- * )
- echo "Available versions are:" $availversions
- ;;
- esac
- exit 1
- fi
-
- case "$progname" in
- emacs | lemacs | xemacs | mule )
- EMACSVARIANT=$progname
- eval ${PROGNAME}VERSION=$version
- eval export EMACSVARIANT ${PROGNAME}VERSION
-
- case "$EMACSVARIANT-$version" in
- emacs-18* ) ISPELLVERSION=4.0 ;;
- emacs-19.[0-9] ) ISPELLVERSION=4.0 ;;
- emacs-19.1[0-9] ) ISPELLVERSION=4.0 ;;
- emacs-19.2[0-2] ) ISPELLVERSION=4.0 ;;
- emacs-19.2[3-9] ) ISPELLVERSION=3.1 ;;
- emacs-* ) ISPELLVERSION=3.1 ;;
-
- lemacs-19.[0-9] ) ISPELLVERSION=3.0.09 ;;
- lemacs-19.10 ) ISPELLVERSION=3.1 ;;
-
- xemacs-* ) ISPELLVERSION=3.1 ;;
-
- mule-* ) ISPELLVERSION=3.1 ;;
- esac
- export ISPELLVERSION
- ;;
- esac
-
- case "$progname" in
- xemacs )
- # xemacs expects to use the keysym database in /usr/openwin, but that
- # database doesn't define many of the keysyms it uses. Unless the user
- # has already defined their own, specify the keysym database in X11.
- XKEYSYMDB="${XKEYSYMDB-/usr/local/X11/lib/X11/XKeysymDB}"
- export XKEYSYMDB
-
- # Some versions of xemacs (e.g. 19.12) are dynamically linked against
- # the openwin tooltalk library (libtt.so), so add openwin to the
- # dynamic load path if necessary.
- case "$LD_LIBRARY_PATH" in
- *'/usr/openwin/lib'* ) : ;;
- '' )
- LD_LIBRARY_PATH=/usr/local/X11R5/lib:/usr/openwin/lib:/lib
- export LD_LIBRARY_PATH
- ;;
- * )
- LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/openwin/lib"
- export LD_LIBRARY_PATH
- ;;
- esac
- ;;
- esac
-
- # Set up the MANPATH so that the man pages for this version
- # are searched first
- if [ -d $prefix/$eprefix$version/man ] ; then
- MANPATH=$prefix/$eprefix$version/man:$MANPATH
- export MANPATH
- fi
-
- # There is no need to do this, and it can potentially cause problems,
- # especially if a program like `xemacs' exists in that directory and gets
- # run in subshells instead of this script.
- #PATH=$prefix/$eprefix$version/bin:$PATH
- #export PATH
-
- searchdirs=`exec 2> /dev/null
- cd $prefix/$eprefix$version \
- && find bin \
- libexec/$VARIANT/$version/* \
- lib/$VARIANT/$version/* \
- lib/$VARIANT-$version/* \
- lib/$VARIANT/etc \
- lib/etc \
- -type d -print`
-
- for dir in $searchdirs ; do
- for p in $progname-$version $progname ; do
- prog="$prefix/$eprefix$version/$dir/$p"
-
- if test -f "$prog" ; then
- case "${EMACS_FE_PRINT+set}" in
- set )
- echo "$prog"
- exit 0
- ;;
- esac
-
- exec "$prog" ${1+"$@"}
- fi
- done
- done
-
- exec 1>&2
-
- echo "$progname: Cannot find $bq$progname-$version$eq or $bq$progname$eq in"
-
- for d in $searchdirs ; do
- ls -1d $prefix/$eprefix$version/$d 2> /dev/null \
- | sed -e "s/^/$progname: /"
- done
-
- exit 1
-
- # emacs-fe ends here
-